// 子系统 A 结构体，定义了子系统 A 的操作。
struct SubsystemA;

// 实现子系统 A 的方法。
impl SubsystemA {
    fn operation_a(&self) -> String {
        "SubsystemA: Ready!\n".to_string() // 返回子系统 A 的准备就绪信息
    }
}

// 子系统 B 结构体，定义了子系统 B 的操作。
struct SubsystemB;

// 实现子系统 B 的方法。
impl SubsystemB {
    fn operation_b(&self) -> String {
        "SubsystemB: Go!\n".to_string() // 返回子系统 B 的启动信息
    }
}

// 外观 Facade 结构体，集成了子系统 A 和子系统 B 的功能。
struct Facade {
    subsystem_a: SubsystemA, // 外观模式持有子系统 A 的实例
    subsystem_b: SubsystemB, // 外观模式持有子系统 B 的实例
}

// 外观 Facade 结构体的实现。
impl Facade {
    // 构造函数 `new()`，初始化外观模式并传入子系统 A 和子系统 B 的实例。
    fn new(subsystem_a: SubsystemA, subsystem_b: SubsystemB) -> Self {
        Self {
            subsystem_a,
            subsystem_b,
        }
    }

    // 操作方法 `operation()`，调用子系统 A 和子系统 B 的操作方法，并返回结果。
    fn operation(&self) -> String {
        let mut result = String::new();
        result.push_str(&self.subsystem_a.operation_a()); // 调用子系统 A 的操作
        result.push_str(&self.subsystem_b.operation_b()); // 调用子系统 B 的操作
        result // 返回操作结果
    }
}

// 主函数入口 `main()`，演示外观模式的使用。
pub fn main() {
    let subsystem_a = SubsystemA; // 创建子系统 A 的实例
    let subsystem_b = SubsystemB; // 创建子系统 B 的实例
    let facade = Facade::new(subsystem_a, subsystem_b); // 创建外观模式的实例，传入子系统 A 和 B
    println!("{}", facade.operation()); // 调用外观模式的操作方法，并打印结果
}
